package com.atguigu.springcloud.service.impl;

import cn.hutool.core.util.IdUtil;
import com.atguigu.springcloud.service.IPaymentService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * 支付接口
 *
 * @author zhenyu
 * @since 2022-08-26
 */
@Service
public class PaymentService implements IPaymentService {

  /**
   * 正常访问，肯定OK
   * @param id
   * @return
   */
  @Override
  public String paymentInfo_OK(Integer id){
    return "线程池: "+Thread.currentThread().getName()+"    paymentInfo_OK,id: "+id+"\t"+"^_^";
  }

  @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
          @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value="3000")
  })
  @Override
  public String paymentInfo_TimeOut(Integer id){

    int timeNumber = 5000;
    //int age = 10/0;
    try {
      Thread.sleep(timeNumber);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return "线程池: "+Thread.currentThread().getName()+"    paymentInfo_OK,id: "+id+"\t"+"^_^"+"  耗时(秒):"+timeNumber;
  }

  /**
   * 此方法是paymentInfo_TimeOut方法利用Hystrix服务降级返回信息的fallback方法。
   * @param id
   * @return
   */
  public String paymentInfo_TimeOutHandler(Integer id){
    return "线程池: "+Thread.currentThread().getName()+"8001系统繁忙或者运行报错，请稍后再试,id: "+id+"\t"+"呜呜";
  }


  //===========================服务熔断===========================
  @Override
  @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",
          commandProperties = {
          @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),//是否开启断路器
          @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),//请求次数
          @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),//时间窗口期
          @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")//失败率达到多少后跳闸 //6次
  })
  public String paymentCircuitBreaker(Integer id){
    if(id < 0){
      throw new RuntimeException("=======id 不能为负数");
    }
    String serialNumber = IdUtil.simpleUUID();//==UUID.randomUUID().toString()
    return Thread.currentThread().getName()+"\t"+"调用成功，流水号："+serialNumber;
  }

  public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
    return "id 不能负数，请稍后再试，，/(ㄒoㄒ)/~~   id: "+id;
  }


}


